package word

import (
	"golang.org/x/text/cases"
	"golang.org/x/text/language"
	"strings"
	"unicode"
)

// ToUpper 单词全部转为大写
func ToUpper(s string) string {
	return strings.ToUpper(s)
}

// ToLower 单词全部转为小写
func ToLower(s string) string {
	return strings.ToLower(s)
}

// UnderscoreToUpperCamelCase 下划线单词转为大写驼峰单词
func UnderscoreToUpperCamelCase(s string) string {
	//将 下划线字符 替换为 空格字符
	s = strings.Replace(s, "_", " ", -1)
	//使用未定义语言将字符串中每个单词的首字母大写
	caser := cases.Title(language.Und)
	s = caser.String(s)
	return strings.Replace(s, " ", "", -1) //将空格字符 替换为 空
}

// UnderScoreToLowerCamelCase 下划线单词转为小写驼峰单词
func UnderScoreToLowerCamelCase(s string) string {
	//将其先转换为 大驼峰单词
	s = UnderscoreToUpperCamelCase(s)
	return string(unicode.ToLower(rune(s[0]))) + s[1:] //将大驼峰字符的首字母转为小写
}

// CamelCaseToUnderscore 驼峰单词转下划线单词
func CamelCaseToUnderscore(s string) string {
	var output []rune
	for i, r := range s {
		//首字母单独处理，大小驼峰通用
		if i == 0 {
			output = append(output, unicode.ToLower(r))
			continue
		}
		//在大写字母前添加 下划线
		if unicode.IsUpper(r) {
			output = append(output, '_')
		}
		//将字母转换为小写 并 append
		output = append(output, unicode.ToLower(r))
	}
	return string(output)
}
